package com.example.android2021.kt_02

import android.content.ClipData.Item

/**
 * @Title: KtExtensions
 * @Package
 * @Description: 扩展函数练习
 * @author dhl
 * @date 2021 1102
 * @version V1.0
 */
fun main() {


    val str = Jump().doubleJump()
    println("str =$str")



    val list = mutableListOf<Int>(1,2,3,4)
    println(list)
    list.swap(0,2)
    println(list)



    val android = "android"
    val lastChar = android.lastChar
    println("lastChar = $lastChar")


    testLet(null)

    var testRun = testRun(Jump())
    println(testRun)


    val list2 = testApply()
    println(list2)





    var a = Jump()
    println(a.one())


}

class Jump{

    fun test():String{
        println("jump!!".six())
        return "charliej"

    }

    // 自定义一个扩展函数
    fun String.six() {

        println("6666")
    }


    fun one() = test()

}

//扩展方法的定义，就是在方法的前面加上前缀 类名.
fun Jump.doubleJump():String{
    return "doubleJump"
}

//泛型扩展方法
fun <T>MutableList<T>.swap(index:Int,index2:Int){
    val temp = this[index]
    this[index] = this[index2]
    this[index2] = temp
}

//扩展属性
val String.lastChar:Char get() = this[length-1]


/**
 * 内置的扩展方法，每个 实例对象 都可以进行调用。   实例对象.内置扩展方法{ ....  }
 */
// let 扩展函数，类后面加上？代表参数可能为空，使用的时候，注意判空
// let 是作用域函数
fun testLet(str:String?){
    str?.let{

        val str2 = "android"
        println(str + it)

    }


}

// run 扩展函数
// 返回值为最后一行的值或者指定的return 的表达式，在run 函数中可以直接 访问实例的公有属性和方法
fun testRun(jump:Jump):String{
    jump.run {
        test()  //  约等于这行代码 jump.test()
        println("66666")
        "123"
    }

    val a = "zwj"
    a.run {
        val char = get(0)
        val b = reversed()

    }


    return "123"


}


// apply 扩展函数
fun testApply(): MutableList<String> {
     return mutableListOf<String>().apply {
        add("1111")
        add("222")
         reversed()


    }





    }





